qt + opengl 绘制地球 您所在的位置:网站首页 北极熊绘画 简单 qt + opengl 绘制地球

qt + opengl 绘制地球

2023-09-05 06:35| 来源: 网络整理| 查看: 265

方法:

先载入纹理图(pLoadTex函数);

再画建立一个二次曲面物体(gluNewQuadric函数),并利用函数gluQuadricTexture声明这个二次曲面可以贴纹理;

在paintGL函数里,只要调用glBindTexture和gluSphere函数,即可绘制地球。

代码:

pro文件:

#------------------------------------------------- # # Project created by QtCreator 2017-11-19T07:35:32 # #------------------------------------------------- QT += core gui opengl greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = GlEarth TEMPLATE = app SOURCES += main.cpp\ mainwindow.cpp HEADERS += mainwindow.h FORMS += mainwindow.ui LIBS += -lopengl32 -lGLU32 h文件:

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include class MainWindow : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: GLUquadricObj * m_pQuadObj; GLuint m_uiTexture; unsigned char * pLoadTex(char *, unsigned long &, unsigned long &); protected: void initializeGL(); void paintGL(); void resizeGL(int w, int h); }; #endif // MAINWINDOW

cpp:

#include "mainwindow.h" #include MainWindow::MainWindow(QWidget *parent) : QOpenGLWidget(parent) { } MainWindow::~MainWindow() { glDeleteTextures(1, &m_uiTexture); gluDeleteQuadric(m_pQuadObj); } void MainWindow::initializeGL() { initializeOpenGLFunctions(); unsigned long bWidth = 0; unsigned long bHeight = 0; QString qstrPath = QDir::currentPath(); qstrPath += "/earth.bmp"; unsigned char * pData = pLoadTex(qstrPath.toLatin1().data(), bWidth, bHeight); glGenTextures(1, &m_uiTexture); glBindTexture(GL_TEXTURE_2D, m_uiTexture); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, bWidth, bHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, pData); glEnable(GL_TEXTURE_2D); m_pQuadObj = gluNewQuadric();//创建一个二次曲面物体 gluQuadricDrawStyle(m_pQuadObj, GL_FILL); gluQuadricNormals(m_pQuadObj, GLU_SMOOTH); gluQuadricOrientation(m_pQuadObj, GLU_OUTSIDE); gluQuadricTexture(m_pQuadObj,GL_TRUE); if (pData) free(pData); glClearColor(0,0,0,0); glEnable(GL_DEPTH_TEST); } void MainWindow::paintGL() { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //glEnable(GL_TEXTURE); glBindTexture(GL_TEXTURE_2D, m_uiTexture); gluSphere(m_pQuadObj, 1.0f, 20, 20); //glDisable(GL_TEXTURE); //gluDeleteQuadric(m_pQuadObj); //删除二次曲面对象 } void MainWindow::resizeGL(int w, int h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); /*GLfloat fAspect; fAspect = (float)w / (float)h; gluPerspective(45.0, fAspect, 1.0, 500.0);*/ glOrtho(-2, 2, -2, 2, 0, 10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } unsigned char * MainWindow::pLoadTex(char * Image, unsigned long & bWidth, unsigned long & bHeight) { FILE* img = NULL; img = fopen(Image, "rb"); DWORD size = 0; fseek(img,18,SEEK_SET); fread(&bWidth,4,1,img); fread(&bHeight,4,1,img); fseek(img,0,SEEK_END); size = ftell(img) - 54; unsigned char *data = (unsigned char*)malloc(size); fseek(img,54,SEEK_SET); // image data fread(data,size,1,img); fclose(img); return data; }

earth.bmp纹理图片在我的资源中。

效果是从南极看地球:



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有